@@ -8,7 +8,7 @@ from django_response import response  | 
            ||
| 8 | 8 | 
                from paginator import pagination  | 
            
| 9 | 9 | 
                 | 
            
| 10 | 10 | 
                from account.models import UserInfo  | 
            
| 11 | 
                -from member.models import MemberActivityContributionInfo, MemberActivityInfo, MemberActivitySignupInfo  | 
            |
| 11 | 
                +from member.models import MemberActivityContributionInfo, MemberActivityInfo, MemberActivitySignupInfo, MemberActivityDataInfo  | 
            |
| 12 | 12 | 
                from utils.error.errno_utils import MemberActivityContributionStatusCode, MemberActivityStatusCode, UserStatusCode  | 
            
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                 | 
            
                @@ -129,6 +129,44 @@ def activity_signup_detail(request):  | 
            ||
| 129 | 129 | 
                 | 
            
| 130 | 130 | 
                 | 
            
| 131 | 131 | 
                @logit  | 
            
| 132 | 
                +def activity_data_submit(request):  | 
            |
| 133 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 134 | 
                +    lensman_id = request.POST.get('lensman_id', '')
               | 
            |
| 135 | 
                +    activity_id = request.POST.get('activity_id', '')
               | 
            |
| 136 | 
                +    data_fields = request.POST.get('data_fields', '[]')
               | 
            |
| 137 | 
                +  | 
            |
| 138 | 
                + try:  | 
            |
| 139 | 
                + act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)  | 
            |
| 140 | 
                + except MemberActivityInfo.DoesNotExist:  | 
            |
| 141 | 
                + return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)  | 
            |
| 142 | 
                +  | 
            |
| 143 | 
                +    MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
               | 
            |
| 144 | 
                + 'title': act.title,  | 
            |
| 145 | 
                + 'lensman_id': lensman_id,  | 
            |
| 146 | 
                + 'data_fields': data_fields,  | 
            |
| 147 | 
                + })  | 
            |
| 148 | 
                +  | 
            |
| 149 | 
                +    return response(data={
               | 
            |
| 150 | 
                + 'activity': act.data(user_id),  | 
            |
| 151 | 
                + })  | 
            |
| 152 | 
                +  | 
            |
| 153 | 
                +  | 
            |
| 154 | 
                +@logit  | 
            |
| 155 | 
                +def activity_data_detail(request):  | 
            |
| 156 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 157 | 
                +    activity_id = request.POST.get('activity_id', '')
               | 
            |
| 158 | 
                +  | 
            |
| 159 | 
                + try:  | 
            |
| 160 | 
                + data_info = MemberActivityDataInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True)  | 
            |
| 161 | 
                + except MemberActivityDataInfo.DoesNotExist:  | 
            |
| 162 | 
                + return response()  | 
            |
| 163 | 
                +  | 
            |
| 164 | 
                +    return response(data={
               | 
            |
| 165 | 
                + 'data_info': data_info.data,  | 
            |
| 166 | 
                + })  | 
            |
| 167 | 
                +  | 
            |
| 168 | 
                +  | 
            |
| 169 | 
                +@logit  | 
            |
| 132 | 170 | 
                def activity_contribute_create(request):  | 
            
| 133 | 171 | 
                     brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
               | 
            
| 134 | 172 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
                @@ -0,0 +1,44 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +# Generated by Django 3.2.16 on 2024-03-06 06:10  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +import jsonfield.fields  | 
            |
| 7 | 
                +import shortuuidfield.fields  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                +class Migration(migrations.Migration):  | 
            |
| 11 | 
                +  | 
            |
| 12 | 
                + dependencies = [  | 
            |
| 13 | 
                +        ('member', '0067_memberactivitysignupinfo_passed'),
               | 
            |
| 14 | 
                + ]  | 
            |
| 15 | 
                +  | 
            |
| 16 | 
                + operations = [  | 
            |
| 17 | 
                + migrations.AlterField(  | 
            |
| 18 | 
                + model_name='memberactivitysignupinfo',  | 
            |
| 19 | 
                + name='lensman_id',  | 
            |
| 20 | 
                + field=models.CharField(blank=True, db_index=True, help_text='摄影师唯一标识', max_length=32, null=True, verbose_name='user_id'),  | 
            |
| 21 | 
                + ),  | 
            |
| 22 | 
                + migrations.CreateModel(  | 
            |
| 23 | 
                + name='MemberActivityDataInfo',  | 
            |
| 24 | 
                + fields=[  | 
            |
| 25 | 
                +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
               | 
            |
| 26 | 
                +                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
               | 
            |
| 27 | 
                +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
               | 
            |
| 28 | 
                +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
               | 
            |
| 29 | 
                +                ('brand_id', models.CharField(blank=True, db_index=True, help_text='品牌唯一标识', max_length=32, null=True, verbose_name='brand_id')),
               | 
            |
| 30 | 
                +                ('brand_name', models.CharField(blank=True, help_text='品牌名称', max_length=255, null=True, verbose_name='brand_name')),
               | 
            |
| 31 | 
                +                ('data_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='活动数据唯一标识', max_length=22, null=True, unique=True)),
               | 
            |
| 32 | 
                +                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')),
               | 
            |
| 33 | 
                +                ('activity_id', models.CharField(blank=True, db_index=True, help_text='活动唯一标识', max_length=32, null=True, verbose_name='activity_id')),
               | 
            |
| 34 | 
                +                ('title', models.CharField(blank=True, help_text='活动名称', max_length=255, null=True, verbose_name='title')),
               | 
            |
| 35 | 
                +                ('lensman_id', models.CharField(blank=True, db_index=True, help_text='摄影师唯一标识', max_length=32, null=True, verbose_name='user_id')),
               | 
            |
| 36 | 
                +                ('data_fields', jsonfield.fields.JSONField(blank=True, default='[]', help_text='自定义数据表单字段', null=True, verbose_name='data_fields')),
               | 
            |
| 37 | 
                + ],  | 
            |
| 38 | 
                +            options={
               | 
            |
| 39 | 
                + 'verbose_name': '会员活动数据信息',  | 
            |
| 40 | 
                + 'verbose_name_plural': '会员活动数据信息',  | 
            |
| 41 | 
                +                'unique_together': {('user_id', 'activity_id')},
               | 
            |
| 42 | 
                + },  | 
            |
| 43 | 
                + ),  | 
            |
| 44 | 
                + ]  | 
            
                @@ -730,7 +730,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin):  | 
            ||
| 730 | 730 | 
                activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)  | 
            
| 731 | 731 | 
                 | 
            
| 732 | 732 | 
                title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')  | 
            
| 733 | 
                - lensman_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)  | 
            |
| 733 | 
                + lensman_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)  | 
            |
| 734 | 734 | 
                 | 
            
| 735 | 735 | 
                avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'头像')  | 
            
| 736 | 736 | 
                name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')  | 
            
                @@ -785,6 +785,49 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin):  | 
            ||
| 785 | 785 | 
                'is_signin': self.is_signin,  | 
            
| 786 | 786 | 
                'passed': self.passed,  | 
            
| 787 | 787 | 
                }  | 
            
| 788 | 
                +  | 
            |
| 789 | 
                +class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin):  | 
            |
| 790 | 
                + data_id = ShortUUIDField(_(u'data_id'), max_length=32, blank=True, null=True, help_text=u'活动数据唯一标识', db_index=True, unique=True)  | 
            |
| 791 | 
                +  | 
            |
| 792 | 
                + user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)  | 
            |
| 793 | 
                +  | 
            |
| 794 | 
                + activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)  | 
            |
| 795 | 
                +  | 
            |
| 796 | 
                + title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')  | 
            |
| 797 | 
                + lensman_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True)  | 
            |
| 798 | 
                +  | 
            |
| 799 | 
                + data_fields = JSONField(_(u'data_fields'), blank=True, null=True, default='[]', help_text=u'自定义数据表单字段')  | 
            |
| 800 | 
                +  | 
            |
| 801 | 
                + class Meta:  | 
            |
| 802 | 
                + verbose_name = _(u'会员活动数据信息')  | 
            |
| 803 | 
                + verbose_name_plural = _(u'会员活动数据信息')  | 
            |
| 804 | 
                +  | 
            |
| 805 | 
                + unique_together = (  | 
            |
| 806 | 
                +            ('user_id', 'activity_id'),
               | 
            |
| 807 | 
                + )  | 
            |
| 808 | 
                +  | 
            |
| 809 | 
                + def __unicode__(self):  | 
            |
| 810 | 
                + return '%d' % self.pk  | 
            |
| 811 | 
                +  | 
            |
| 812 | 
                + @property  | 
            |
| 813 | 
                + def data(self):  | 
            |
| 814 | 
                +        return {
               | 
            |
| 815 | 
                + 'signup_id': self.data_id,  | 
            |
| 816 | 
                + 'lensman_id': self.lensman_id,  | 
            |
| 817 | 
                + 'title': self.title,  | 
            |
| 818 | 
                + 'data_fields': json.loads(self.data_fields) if self.data_fields else [],  | 
            |
| 819 | 
                + }  | 
            |
| 820 | 
                +  | 
            |
| 821 | 
                + @property  | 
            |
| 822 | 
                + def admindata(self):  | 
            |
| 823 | 
                +        return {
               | 
            |
| 824 | 
                + 'signup_id': self.data_id,  | 
            |
| 825 | 
                + 'user_id': self.user_id,  | 
            |
| 826 | 
                + 'lensman_id': self.lensman_id,  | 
            |
| 827 | 
                + 'activity_id': self.activity_id,  | 
            |
| 828 | 
                + 'title': self.title,  | 
            |
| 829 | 
                + 'data_fields': json.loads(self.data_fields) if self.data_fields else [],  | 
            |
| 830 | 
                + }  | 
            |
| 788 | 831 | 
                 | 
            
| 789 | 832 | 
                 | 
            
| 790 | 833 | 
                class MemberActivitySigninInfo(BaseModelMixin, BrandInfoMixin):  | 
            
                @@ -20,6 +20,13 @@ urlpatterns += [  | 
            ||
| 20 | 20 | 
                url(r'^member/activity/signin$', activity_mp_views.activity_signin, name='mp_member_activity_signin'), # 会员活动签到  | 
            
| 21 | 21 | 
                ]  | 
            
| 22 | 22 | 
                 | 
            
| 23 | 
                +# activity data  | 
            |
| 24 | 
                +urlpatterns += [  | 
            |
| 25 | 
                + url(r'^member/activity/data/submit$', activity_mp_views.activity_data_submit, name='mp_member_activity_data_submit'), # 会员活动数据提交  | 
            |
| 26 | 
                + url(r'^member/activity/data/detail$', activity_mp_views.activity_data_detail, name='mp_member_activity_data_detail'), # 获取会员活动报名信息  | 
            |
| 27 | 
                +]  | 
            |
| 28 | 
                +  | 
            |
| 29 | 
                +  | 
            |
| 23 | 30 | 
                # activity contribution  | 
            
| 24 | 31 | 
                urlpatterns += [  | 
            
| 25 | 32 | 
                url(r'^member/activity/contribute/create$', activity_mp_views.activity_contribute_create, name='mp_member_activity_contribute_create'),  |